 package kr.ac.skhu.m.controller;

import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.ac.skhu.m.util.EncodingUtil;
import kr.ac.skhu.m.util.PaggingUtil;
import kr.ac.skhu.m.util.StringUtil;
import kr.ac.skhu.m.value.BookData;

import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.HTMLElementName;
import net.htmlparser.jericho.Source;

import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

/**
 * 도서관 컨트롤러
 * @author han
 *
 */
public class LibraryC extends AbstractController {
	
	private String successView;
	
	public void setSuccessView(String successView) {
		this.successView = successView;
	}

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		ModelAndView mav = new ModelAndView(successView);
		
		/**
		 * request 요청 파라미터 받는 부분
		 */
		//get 요청인지를 판별. get이면 true, post이면 false. get 방식은 링크 이동과 주소창 입력 두가지가 있음.
		boolean isGet = request.getMethod().equals("GET");
		//검색어를 입력받는다. 검색어를 UTF-8로 인코딩하여 받는다.
		String qy_kwd = isGet ? EncodingUtil.getParamterSafely(request.getQueryString(), "qy_kwd") : ServletRequestUtils.getStringParameter(request, "qy_kwd", "");
		//검색어를 도서관 서버에 요청하기 위해 UTF-8로 다시 인코딩한다.
		String qeury_kwd = URLEncoder.encode(qy_kwd, "UTF-8");
		//검색어가 null인지 판별하여 null이면 "" 빈 문자열값. 아니면 입력받은 값을 대입.
		qeury_kwd = StringUtil.isNull(qeury_kwd);
		String curpage = ServletRequestUtils.getStringParameter(request, "curpage", "1");
		
		StringBuilder sb = new StringBuilder("http://library.skhu.ac.kr/DLiWeb20/components/searchir/result.aspx?");
		sb.append("m_var=421&");
		sb.append("srv_id=31&");
		sb.append("hdnDexpeedRsid=&");
		sb.append("brch=ALL&");
		sb.append("loc=ALL&");
		sb.append("alias=&");
		sb.append("cl_id=ALL&");
		sb.append("qy_frm=&");
		sb.append("qy_typ=&");
		sb.append("s_cache=&");
		sb.append("g_hit=&");
		sb.append("adf=&");
		sb.append("adt=&");
		sb.append("rid_all=&");
		sb.append("st_f=&");
		sb.append("st_o=&");
		sb.append("pg=" + curpage +"&");
		sb.append("rpp=20&");
		sb.append("mc=300&");
		sb.append("dp_op=LIST&");
		sb.append("qy_idx=TITL&");
		sb.append("qy_kwd=" + qeury_kwd + "&");
		sb.append("qy_opt=AND&");
		sb.append("principal=&");
		sb.append("t_path=&");
		sb.append("hdnDexMode=PAGE&");
				
		//System.out.println(sb.toString());
		
		/**
		 * 검색 정보 요청
		 */
		//검색 정보를 요청할 URL
		String url = sb.toString();
		//해당 URL 페이지를 가져온다.
		Source source = new Source(new URL(url));
		//메소드 찾기를 위해 시작부터 끝까지 태그들만 parse 한다 (?)
		source.fullSequentialParse();
		//System.out.println(source);
		
		//제리코 파서를 이용하여 도서정보를 검색할 결과 테이블을 가져온다.
		Element tblSearchResult = source.getElementById("tblSearchResult");
		List<Element> tr = tblSearchResult.getAllElements(HTMLElementName.TR); 
		int trSize = tr.size();
		mav.addObject("size", trSize);
		
		/**
		 * 검색된 결과를 객체에 담는다.
		 */
		//응답받은 도서들을 담을 List
		List<BookData> bookList = new ArrayList<BookData>();
		
		//도서정보를 담는다.
		for(int i=0; i<trSize; i=i+4){
			
			Element trElement = tr.get(i); 
			Element dataTable = trElement.getAllElements(HTMLElementName.TABLE).get(0);
			Element imgTd = dataTable.getAllElements(HTMLElementName.TD).get(0);
			Element dataTd = dataTable.getAllElements(HTMLElementName.TD).get(1);
			
			//도서 객체
			BookData bookData = new BookData();
			
			//책 번호
			bookData.setBookId(trElement.getAttributeValue("id").replace("trCID_", ""));
			
			//이미지
			if(imgTd.getAllElements(HTMLElementName.IMG).size() > 0){
				//<img>태그(이미지)가 있다면 src 속성 값을 담는다.
				String imgSrc = imgTd.getAllElements(HTMLElementName.IMG).get(0).getAttributeValue("src");
				imgSrc.replace("203.246.75.26", "www.skhu.ac.kr");
				bookData.setImg(imgSrc);
			}else{
				//<img>태그(이미지)가 없다면 빈 문자열 값을 담는다.
				bookData.setImg("");
			}
			
			//도서정보
			List<Element> dataTdSpan = dataTd.getAllElements(HTMLElementName.SPAN);
			int dataTdSpanSize = dataTdSpan.size();
			
			for(int j=0; j<dataTdSpanSize; j++){
				
				Element span = dataTdSpan.get(j);
				String setString = span.getTextExtractor().toString();
				String spanClass = StringUtil.isNull(span.getAttributeValue("class"));
				String spanTitle = StringUtil.isNull(span.getAttributeValue("title"));
				
				//도서명, 저자, 출판사, 발행년도 별로 도서정보를 담는다.
				if(spanClass.equals("result_title") || spanTitle.equals("result_title")){
					bookData.setTitle(setString);
				}else if(spanClass.equals("저자") || spanTitle.equals("저자")){
					bookData.setAuthor(setString);
				}else if(spanClass.equals("출판사") || spanTitle.equals("출판사")){
					bookData.setPublisher(setString);
				}else if(spanClass.equals("발행년도") || spanTitle.equals("발행년도")){
					bookData.setYear(setString);
				}
				
			}
			
			//도서의 위치정보를 담는다. 만약 위치정보가 존재하지 않는다면 빈 문자열로 담는다.
			List<Element> dataTdA = dataTd.getAllElements(HTMLElementName.A);
			String location = "비소장도서";
			
			if(dataTdA.size() > 2){
				location = dataTdA.get(2).getTextExtractor().toString();
				location = location.equals("미리보기") ? "" : location;
			}
			
			bookData.setLocation(location);		
			
			//값을 모두 담은 도서 객체를 List객체에 담는다.
			bookList.add(bookData);
		}
		
		PaggingUtil paggingUtil = null;
		
		if(trSize > 0){
			Element tblPageNavigator = source.getElementById("tblPageNavigator");
			int curPageNum = Integer.parseInt(tblPageNavigator.getAllElementsByClass("num_orange").get(0).getTextExtractor().toString());
			List<Element> tblPageNavigatorA = tblPageNavigator.getAllElements(HTMLElementName.A);
			String lastPage = tblPageNavigatorA.get(tblPageNavigatorA.size()-1).getAttributeValue("href");
			lastPage = lastPage.replace("javascript:goPage(", "");
			lastPage = lastPage.replace("javascript:alert('현재 페이지가 마지막 페이지 입니다')", "");
			lastPage = lastPage.replace(");", "");
			
			if(lastPage.equals("")){
				lastPage = curpage;
			}
			
			int lastPageNum = Integer.parseInt(lastPage);
			
			paggingUtil = new PaggingUtil(curPageNum, lastPageNum);
		}else{
			paggingUtil = new PaggingUtil(1, 1);
		}
		
		mav.addObject("paggingUtil", paggingUtil);
		mav.addObject("qy_kwd", qy_kwd);
		mav.addObject("bookList", bookList);
		
		return mav;
	}
	
}